#ifndef MESH_RENDER
#define MESH_RENDER

class EffectShadow;
class Effect;
#include "../Forest/TreeNode.h"
#include <map>
#include "../DrawableTex2D.h"

typedef UINT mesh_id;

/** 
* Mesh wordt gebruikt om de veschillende meshes aan te maken en uit te renderen.
* @author Ruben Rigole
* @todo De Meshes van voor naar achter sorteren.
* @todo Alle meshes insteken
*/
class Mesh
{
public:
	Mesh();
	virtual ~Mesh();

	/** 
	* Kijkt welke mesh het is en maakt het aan.
	* @param file Het volledige pad naar de mesh
	* @param state Welke PhysX state het moet gebruiken
	* @param pos De positie
	* @param rot De rotatie
	* @return De meshID.
	*/
	mesh_id CreateMesh(const tstring& file, MeshDesc::PhysxState state = MeshDesc::PhysxStatic, const D3DXVECTOR3& pos = D3DXVECTOR3(0, 0, 0), const D3DXVECTOR3& rot = D3DXVECTOR3(0, 0, 0));
	
	/** 
	* Maakt een skybox
	* @Param file Het volledige pad naar de texture
	* @param size De grootte van de skybox
	*/
	mesh_id CreateSkybox(const tstring& file, int size);

	/** 
	* Maakt een skybox
	* @Param file Het volledige pad naar de texture
	* @param size De grootte van de skybox
	*/
	mesh_id CreateFlatTerrain(const tstring& file, int size);

	/** 
	* Maakt een skybox
	* @Param file Het volledige pad naar de texture
	* @param size De grootte van de skybox
	*/
	mesh_id CreateTerrain(const tstring& file, int size);

	/** 
	* Maakt een Box
	* @Param file Het volledige pad naar de texture
	* @param width De breedte van de box
	* @param length De lengte van de box
	* @param height De hoogte van de box
	* @param pos De Positie van de box
	*/
	mesh_id CreateBox(const tstring& name, const tstring& file, const tstring& normalMap, const tstring& specMap, float width, float length, float height, const D3DXVECTOR3& pos = D3DXVECTOR3(0,0,0), MeshDesc::PhysxState state = MeshDesc::PhysxStatic);

	/** 
	* Update alle meshes
	* @param dTime De tijd verstreken sinds laatste frame
	*/
	void Tick(float dTime);
	
	/** 
	* Renderd alle meshes uit
	*/
	void Render();
	
	/** 
	* Geeft een kracht aan een mesh
	* @param force Een D3DXVECTOR3 die de kracht beschrijft.
	*/
	void AddForce(const D3DXVECTOR3& force);
	
	/** 
	* Verkrijg de mesh via id
	* @param meshId De ID van de mesh;
	* @return De Mesh als TreeNode.
	*/
	TreeNode* GetMesh(mesh_id meshId);
	
	/** 
	* Geef het aantal meshes weer.
	* @return Het aantal meshes.
	*/
	int GetCount() const;

	/** 
	* @return de id van de mesh
	*/
	mesh_id	GetId(const tstring& name);

private:
	vector<TreeNode*> m_Meshes;

	ID3D10InputLayout* m_VertexLayout;

	EffectShadow* m_ShadowEffect;
	Effect* m_Effect;

	DrawableTex2D m_ShadowMap;

	mesh_id m_SkyBox;
	bool m_Saved;

	//Light settings
	D3DXMATRIX m_LightWorld, m_LightView, m_LightProj;

	Mesh(const Mesh &t);
	Mesh& operator= (const Mesh &t);
};
#endif